from strategy.StrategyTemplate import StrategyTemplate
from utils.jsl_data_map import default_columns
from strategy import strategy_filter
import qstock as qs
from utils import pd_show_utils

# TODO qisi 偏离可以做
# TODO new 三因素 双低值 + 溢价率 - 到期税前收益
# TODO new 小规模 低溢价 高价策略 剩余规模小于10亿 现价介于130-200 溢价率 5-30
# TODO new 低溢价率 从低到高排序
# TODO qisi 双低 可以做
# TODO new 次新小盘策略 中签率<0.001 未开始转股 剩余规模小
# TODO new 小盘新债策略 发行规模小于5亿 按发行日期排序
# TODO new 三低也没啥+筛选器
# TODO 高价高溢价 现价大于130 溢价率大于80
class PianLi(StrategyTemplate):
    """
    股票近5天涨幅
    偏离评分 = (可转债近5天涨幅-股票近5天涨幅+溢价率)×100

        偏离评分越小越好，并排除掉已公告强赎具体日期的转债

    买入方法:

        等权重买入排名前 5 的转债
        等权重的意思就是，5只债买入相同或相近金额。
    卖出方法:

    每周固定时间轮动
        比如本周一14:00买了前5只，下周一14:00看名单，还在的留下，不在的剔除，纳入新进入的
        中间无论亏损或者盈利都不管，放着不动，到计划的时间再进行操作（所以这个波动一般人承受不了）
        详细介绍: 偏离策略

    展示总数: 20

    """
    def __init__(self):
        super(self.__class__, self).__init__()
        self.strategy_name = "启四偏离策略"
        self.strategy_descrption = "按涨幅排序"

    def run(self):
        # 基础过滤，过滤掉新债、强赎、EB
        self.data = strategy_filter.filter_base(self.data)
        filter_list = []
        for num, code_tuple in self.data[['转债代码', '正股代码']].iterrows():
            try:
                bond_code, stock_code = str(code_tuple[0]), str(code_tuple[1])
                result = qs.get_data([stock_code])['close']
                five_sincrease = round((result[-1] - result[-6]) / result[-6], 4) * 100
                self.data.loc[self.data["转债代码"] == bond_code, '正股5日涨跌幅'] = five_sincrease
                self.data['偏离值'] = self.data["近5日涨跌幅"] - self.data["正股5日涨跌幅"]
                self.data['评分'] = self.data['偏离值'] + self.data['溢价率']
            except ValueError as e:
                pass
        self.data = self.data[['转债名称', '转债代码', '偏离值', '溢价率', '评分', '现价', '剩余年限',  '到期税前收益',
                               '剩余规模', '行业', '近5日涨跌幅', "正股5日涨跌幅"]][:20]
        self.data = self.data.sort_values(by='评分', ascending=True)

        # 清掉原来的索引
        self.data.reset_index(inplace=True, drop=True)


if __name__ == '__main__':
    ins = PianLi()
    ins.topN = 20
    ins.test()

